

/**
 *
 * @Dec 获取字符串长度
 * @Author zpw
 * @Param val :查找的字符串
 *
 **/
export const getByteLen = (val) => {
  var len = 0;
  for (var i = 0; i < val.length; i++) {
    var a = val.charAt(i);
    if (a.match(/[^\x00-\xff]/ig) != null) {
      len += 2;
    }
    else {
      len += 1;
    }
  }
  return len;
};


/**
 *
 * @Dec 在数组中查找所有出现的x，并返回一个包含匹配索引的数组
 * @Author zpw
 * @Param a：传入的数组，x: 查找的字符串
 *
 **/
export const  findEle = (a,x) => {
  let results = [],
    len = a.length,
    pos = 0;
  while (pos < len) {
    pos = a.indexOf(x, pos);
    if (pos === -1) {//未找到就退出循环完成搜索
      break;
    }
    results.push(pos);//找到就存储索引
    pos += 1;//并从下个位置开始搜索
  }
  return results;
};


/**
 *
 * @Dec     判断数据类型（2种使用方法）
 * @author  zpw
 * @Param   data,    workType: true表示你要检测的数据是否是你需要的类型 ； false(default)表示你要获取传入的数据是那个类型
 * @如何使用: dataType为true的状态：dataType(data,true).isNumber(data) ; dataType为false 的状态：dataType(data)
 *
 */

export const  dataType = (data,workType) => {
  if(workType == true || workType == "true"){
    let type = {} , i = 0 , typeArr = [];
    typeArr = ['String', 'Object', 'Number', 'Array','Undefined', 'Function', 'Null', 'Symbol'];
    for (i ; i < typeArr.length; i++) {
      (function(name) {
        type['is' + name] = function(data) {
          return Object.prototype.toString.call(data) == '[object ' + name + ']';
        }
      })(typeArr[i]);
    }
    return type;
  }else{
    return Object.prototype.toString.call(data);
  }
};

/**
 *
 * @Dec 将字符串转为number类型
 * @Author zpw
 * @Param s: 字符串
 *
 **/
export const  charTransNumber = (s) => {
  if(arguments.length > 1){
    return parseInt(s);
  }else{
    return parseFloat(s);
  }
};

/**
 *
 * @Dec 金额保留两位小数
 * @Author zpw
 * @Param num: number
 *
 **/
export const  fixedRes = (num) => {
  if(!dataType(num,true).isNumber(num)){
    num = charTransNumber(num)
  }
  return  num.toFixed(2); //仅支持ie5以上
};



/**
 *
 *常用正则验证
 *@author zpw
 *@param str,type[0:手机号：1:邮箱；2: 昵称；3：密码，4：身份证号，5：QQ号，6：微信号，7：是否包含中文，8：是否只包含正整数]
 *
 */
export const  check = (str,type) =>{
  if(type == "0"){
    if(!(/^1(3|4|5|7|8)\d{9}$/.test(str))){  //表示以1开头，第二位可能是3/4/5/7/8等的任意一个，在加上后面的\d表示数字[0-9]的9位，总共加起来11位结束
      return false;
    }else{
      return true;
    }
  }else if(type == "1"){
    if(!(/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(str))){  //email地址
      return false;
    }else{
      return true;
    }
  }else if(type == "2"){
    if(!(/^[a-zA-Z0-9_-]{4,16}$/.test(str))){ // 4到16位（字母，数字，下划线，减号）
      return false;
    }else{
      return true;
    }
  }else if(type == "3"){
    if(!(/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,10}$/.test(str))){ // 6~10位由数字和26个英文字母混合而成的密码
      return false;
    }else{
      return true;
    }
  }else if(type == "4"){
    if(!(/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(str))){ // 身份证号
      return false;
    }else{
      return true;
    }
  }else if(type == "5"){
    if(!(/^[1-9][0-9]{4,10}$/.test(str))){  // QQ号
      return false;
    }else{
      return true;
    }
  }else if(type == "6"){
    if(!(/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/.test(str))){ //微信号
      return false;
    }else{
      return true;
    }
  }else if(type == "7"){
    if(!(/[\u4E00-\u9FA5]/.test(str))){ //是否包含中文
      return false;
    }else{
      return true;
    }
  }else if(type == "8"){
    if(!(/^\+?[1-9]\d*$/.test(str))){ //是否只包含正整数
      return false;
    }else{
      return true;
    }
  }

}

/**
 *
 * 用setTimeout来替代setInterval，解决多个定时器同时执行的bug
 * @author zpw
 * @param fnfs: 要轮询执行的代码块 fnfe: 结束定时器时执行的代码块 delay:间隔时间(毫秒) forStart: 要执行几次定时器 forEnd: 结束定时器的值
 * @Important 必须定义三个全局变量 timerCollector AS $timerCollector 的空数组 和  initRunNumber AS $initRunNumber 变量 和 endRunNumber AS $endRunNumber 变量
 * timerCollector ： 清除所有定时器
 * initRunNumber ： 执行多少次定时器
 * endRunNumber ： 如果想让定时器执行有限次，那就传一个数字类型，当initRunNumber = 你传的这个数字的时候,定时器就停止了； 如果想让定时器无限循环，直接endRunNumber等于任意字符串类型即可
 *
 */

export const  timer = (fnfs,fnfe,delay,forStart,forEnd) =>{
  try{
    let isNumber = dataType(forEnd,true).isNumber(forEnd);
    let fs = parseInt(forStart), fe = parseInt(forEnd);

    if(forEnd == "No"){
      fnfe();
      clearAllInterval();
      return;
    }

    if(isNumber){ //如果是传的是数字 那说明定时器是有限次的循环
      if(initRunNumber > fe && initRunNumber != fe){
        fnfs();
        timerCollector.push(setTimeout(function(){
          timer(fnfs,fnfe,delay,forStart,forEnd);
        },delay));
      }else{
        fnfe();
        clearAllInterval();
        initRunNumber = fs;
      }
    }else{ //定时器无限循环( 直到程序员设定 forEnd = "No" )
      fnfs();
      timerCollector.push(setTimeout(function(){
        timer(fnfs,fnfe,delay,forStart,forEnd);
      },delay));
    }

  }catch(error){
    console.log(error);
  }
};


/**
 *
 *获取地址栏制定参数
 *@author zpw
 *@param str
 *
 */
export const getUrlParam = (name) => {
  return decodeURIComponent((new RegExp('[?|&]'+name+'='+'([^&;]+?)(&|#|;|$)').exec(window.location.href)||[,""])[1].replace(/\+/g,'%20'))||null;
};

/**
 *
 * 清除定时器
 * @author zpw
 * @param null
 * @Important 必须在js中定义一个全局叫 timerCollector 的空数组
 *
 */

export const  clearAllInterval = () =>{
  try{
    for(let i=0;i<timerCollector.length;i++){
      clearInterval(timerCollector[i])
    }
  }catch(error){
    console.log(error);
  }
};


/**
 *
 *提取浏览器视口各项参数值[clientWidth,clientHeight,scrollWidth,scrollHeight,scrollLeft,scrollTop]
 *@author zpw
 *@param  null
 *
 */


export const  documentViewportParam = () =>{
  let viewPortProperty = {};
  if (document.compatMode == "BackCompat") {
    viewPortProperty.cWidth = document.body.clientWidth;
    viewPortProperty.cHeight = document.body.clientHeight;
    viewPortProperty.sWidth = document.body.scrollWidth;
    viewPortProperty.sHeight = document.body.scrollHeight;
    viewPortProperty.sLeft = document.body.scrollLeft;
    viewPortProperty.sTop = document.body.scrollTop;
  }
  else { //document.compatMode == "CSS1Compat"
    viewPortProperty.cWidth = document.documentElement.clientWidth;
    viewPortProperty.cHeight = document.documentElement.clientHeight;
    viewPortProperty.sWidth = document.documentElement.scrollWidth;
    viewPortProperty.sHeight = document.documentElement.scrollHeight;
    viewPortProperty.sLeft = document.documentElement.scrollLeft == 0 ? document.body.scrollLeft : document.documentElement.scrollLeft;
    viewPortProperty.sTop = document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;
  }
  return viewPortProperty
};


/**
 *
 * @Dec 设置域名路径
 * @Author zpw
 * @Param null
 *
 **/
export const getDomain = () =>{
  let agreement = "https://";
  let domain = window.location.host;
  return agreement+domain;
};

/**
 *
 *替换手机号中间4位为*号
 *@author zpw
 *@param str
 *
 */
export const replacePhoneNumber = (phoneString) =>{
  return phoneString.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
};


export default {
  getUrlParam,
  getDomain
}




